home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / Dev / Oberon / examples.lha / Examples / Oberon0 / IO.mod < prev    next >
Encoding:
Text File  |  1995-04-16  |  3.2 KB  |  124 lines

  1. MODULE io;  (* HM 17-Dec-91, fjc 15/4/95 *)
  2. IMPORT Texts0, TextFrames0;
  3.  
  4. CONST
  5.   none* = 0; integer* = 1; name* = 2; string* = 3; char* = 4;
  6.  
  7. TYPE
  8.   Scanner* = RECORD
  9.     text-: Texts0.Text;
  10.     class-: INTEGER;
  11.     int-: LONGINT;
  12.     str-: ARRAY 32 OF CHAR;
  13.     ch-: CHAR;
  14.     c: CHAR
  15.   END;
  16.  
  17. VAR
  18.   out*: Texts0.Text;
  19.  
  20. PROCEDURE (VAR s: Scanner) Set* (t: Texts0.Text; pos: LONGINT);
  21. BEGIN
  22.   s.text := t; t.SetPos(pos); s.class := none; s.c := " "
  23. END Set;
  24.  
  25. PROCEDURE (VAR s: Scanner) SetToParameters*;
  26. BEGIN
  27.   s.Set(TextFrames0.cmdFrame.text, TextFrames0.cmdPos)
  28. END SetToParameters;
  29.  
  30. PROCEDURE (VAR s: Scanner) Pos* (): LONGINT;
  31. BEGIN
  32.   RETURN s.text.pos
  33. END Pos;
  34.  
  35. PROCEDURE (VAR s: Scanner) Eot* (): BOOLEAN;
  36. BEGIN
  37.   RETURN s.text.pos >= s.text.len
  38. END Eot;
  39.  
  40. PROCEDURE (VAR s: Scanner) Read*;
  41.   VAR i: INTEGER; old: CHAR;
  42. BEGIN
  43.   WHILE (s.text.pos < s.text.len) & (s.c <= " ") DO s.text.Read(s.c) END;
  44.   IF s.text.pos >= s.text.len THEN
  45.     s.class := none
  46.   ELSIF (CAP(s.c) >= "A") & (CAP(s.c) <= "Z") THEN
  47.     i := 0;
  48.     REPEAT
  49.       s.str[i] := s.c; INC(i); s.text.Read(s.c)
  50.     UNTIL  ~((CAP(s.c) >= "A") & (CAP(s.c) <= "Z")
  51.           OR (s.c >= "0") & (s.c <= "9") OR (s.c = ".")
  52.           OR (s.c = ":") OR (s.c = "/"));
  53.     s.str[i] := 0X; s.class := name
  54.   ELSIF (s.c >= "0") & (s.c <= "9") THEN s.int := 0; s.class := integer;
  55.     REPEAT
  56.       s.int := 10 * s.int + ORD(s.c) - ORD("0"); s.text.Read(s.c)
  57.     UNTIL (s.c < "0") OR (s.c > "9")
  58.   ELSIF (s.c = "'") OR (s.c = '"') THEN
  59.     old := s.c; s.text.Read(s.c); i := 0;
  60.     WHILE s.c # old DO s.str[i] := s.c; INC(i); s.text.Read(s.c) END;
  61.     s.str[i] := 0X; s.text.Read(s.c); s.class := string
  62.   ELSE
  63.     s.ch := s.c; s.text.Read(s.c); s.class := char;
  64.     IF ((s.ch = "-") OR (s.ch = "+")) & (s.c >= "0") & (s.c <= "9") THEN
  65.       s.int := 0; s.class := integer;
  66.       REPEAT
  67.         s.int := 10 * s.int + ORD(s.c) - ORD("0"); s.text.Read(s.c)
  68.       UNTIL (s.c < "0") OR (s.c > "9");
  69.       IF s.ch = "-" THEN s.int := -s.int END
  70.     END
  71.   END
  72. END Read;
  73.  
  74.  
  75. PROCEDURE Ch* (ch: CHAR);
  76. BEGIN
  77.   out.Write(ch)
  78. END Ch;
  79.  
  80. PROCEDURE Str* (s: ARRAY OF CHAR);
  81.   VAR i: INTEGER;
  82. BEGIN
  83.   i := 0; WHILE s[i] # 0X DO out.Write(s[i]); INC(i) END
  84. END Str;
  85.  
  86. PROCEDURE Int* (x: LONGINT; w: INTEGER);
  87.   VAR a: ARRAY 10 OF CHAR; i: INTEGER;
  88. BEGIN
  89.   IF x < 0 THEN out.Write("-"); DEC(w); x := -x END;
  90.   i := 0;
  91.   REPEAT
  92.     a[i] := CHR(ORD("0") + x MOD 10); INC(i); x := x DIV 10
  93.   UNTIL x = 0;
  94.   WHILE w > i DO out.Write(" "); DEC(w) END;
  95.   REPEAT DEC(i); out.Write(a[i]) UNTIL i = 0
  96. END Int;
  97.  
  98. PROCEDURE Real* (x: REAL; w: INTEGER);
  99.   VAR exp, i: INTEGER; d: REAL; a: ARRAY 16 OF CHAR; y: LONGINT;
  100. BEGIN
  101.   exp := 0;
  102.   IF x < 0 THEN Ch("-"); DEC(w); x := -x END;
  103.   d := 1; WHILE x >= 10*d DO d := d * 10; INC(exp) END; x := x / d;
  104.   d := 1; WHILE x < d DO d := d / 10; DEC(exp) END; x := x * d;
  105.   Int(ENTIER(x), 0); Ch("."); DEC(w, 6); (*x.E+yy*)
  106.   x := (x - ENTIER(x)); i := w; WHILE i > 0 DO x := x * 10; DEC(i) END;
  107.   y := ENTIER(x);
  108.   i := 0;
  109.   REPEAT
  110.     a[i] := CHR(ORD("0") + y MOD 10); INC(i); y := y DIV 10
  111.   UNTIL y = 0;
  112.   WHILE w > i DO out.Write("0"); DEC(w) END;
  113.   REPEAT DEC(i); out.Write(a[i]) UNTIL i = 0;
  114.   Ch("E");
  115.   IF exp < 0 THEN Ch("-"); Int(-exp, 2) ELSE Ch("+"); Int(exp, 2) END
  116. END Real;
  117.  
  118. PROCEDURE NL*;
  119. BEGIN
  120.   out.Write(0DX)
  121. END NL;
  122.  
  123. END io.
  124.